package es.gesfutbol.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.IdJugadorEnEquip;
import es.gesfutbol.domini.implementacio.Jugador;
import es.gesfutbol.domini.implementacio.JugadorEnEquip;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class JugadorEnEquipDao extends HibernateDao<JugadorEnEquip, IdJugadorEnEquip> implements IJugadorEnEquipDao{

	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<JugadorEnEquip> findByIdJugador(Long idJugador) {
		return this.getSessionFactory().getCurrentSession().createCriteria(JugadorEnEquip.class)
				.add(Restrictions.eq("id.jugador.idJugador", idJugador)).list();
	}

	@Override
	@Transactional(readOnly = false)
	public void saveOrUpdate(JugadorEnEquip jugadorEnEquip) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(jugadorEnEquip);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<JugadorEnEquip> findByIdJugadorDeproxy(Long idJugador) {
		
		List<JugadorEnEquip> jugadorsEnEquip =  this.getSessionFactory().getCurrentSession().createCriteria(JugadorEnEquip.class)
		.add(Restrictions.eq("id.jugador.idJugador", idJugador)).list();
		
		List<JugadorEnEquip> jugadorsEnEquipDeproxy = null;
		
		if(jugadorsEnEquip!=null && jugadorsEnEquip.size()>0){
			jugadorsEnEquipDeproxy = new ArrayList<JugadorEnEquip>();
			for(JugadorEnEquip j : jugadorsEnEquip){
				jugadorsEnEquipDeproxy.add(deproxy(j));
			}
		}
		return jugadorsEnEquipDeproxy;
	}
	
	@Override
	@Transactional(readOnly = true)
	public JugadorEnEquip findJugadorEnEquipByJugadorIEquipDeproxy(
			Long idJugador, Long idEquip) {
		JugadorEnEquip jugador = (JugadorEnEquip) this.getSessionFactory().getCurrentSession().createCriteria(JugadorEnEquip.class)
				.add(Restrictions.eq("id.jugador.idJugador", idJugador))
				.add(Restrictions.eq("id.equip.idEquip", idEquip))
				.uniqueResult();
		return deproxy(jugador);
	}	
	
	@Override
	@Transactional(readOnly = true)
	public JugadorEnEquip findJugadorEnEquipByJugadorIEquip(Long idJugador,
			Long idEquip) {
		return (JugadorEnEquip) this.getSessionFactory().getCurrentSession().createCriteria(JugadorEnEquip.class)
		.add(Restrictions.eq("id.jugador.idJugador", idJugador))
		.add(Restrictions.eq("id.equip.idEquip", idEquip))
		.uniqueResult();
	}
	
	@Override
	public JugadorEnEquip deproxy(JugadorEnEquip jugadorEnEquip) {
		
		//Deproxy dels jugador.
		Jugador jugador = jugadorEnEquip.getId().getJugador();
		Hibernate.initialize(jugador);
		jugador = HibernateHelper.deproxy(jugador, Jugador.class);
		jugadorEnEquip.getId().setJugador(jugador);
		
		//Deproxy Equip.
		Equip equip = jugadorEnEquip.getId().getEquip();
		Hibernate.initialize(equip);
		equip = HibernateHelper.deproxy(equip, Equip.class);
		jugadorEnEquip.getId().setEquip(equip);
		
		return jugadorEnEquip;
	}
}
